package com.realtrackandroid.views.participationsdonesummaries;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.achartengine.GraphicalView;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.model.XYSeries;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import android.bluetooth.BluetoothAdapter;
import android.content.ComponentName;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.AsyncTask.Status;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.DialogFragment;
import android.widget.ExpandableListView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.LineSeparator;
import com.realtrackandroid.R;
import com.realtrackandroid.backend.activities.ActivitiesDAO;
import com.realtrackandroid.backend.activities.ParticipantDAO;
import com.realtrackandroid.backend.activities.ParticipationDAO;
import com.realtrackandroid.backend.projects.ProjectDAO;
import com.realtrackandroid.models.activities.Activities;
import com.realtrackandroid.models.activities.Participant;
import com.realtrackandroid.models.activities.Participation;
import com.realtrackandroid.models.projects.Project;
import com.realtrackandroid.providers.CachedFileContentProvider;
import com.realtrackandroid.views.help.FrameworkInfoDialog;
import com.realtrackandroid.views.help.GlossaryDialog;
import com.realtrackandroid.views.help.HelpDialog;
public class ParticipationSummaryActivity extends SherlockFragmentActivity {
private static final int SENDEMAIL_REQUEST = 1;
private static final int SENDBT_REQUEST = 2;
private static final String PROGRESS_DIALOG_TAG = "progressDialog";
private static final Font TITLE_FONT = new Font(FontFamily.HELVETICA, 18);
private int maxComms = 0;
private final String ESCAPE_COMMAS = "\"";
private final String COMMUNITY_DELIMITER = "@_@";
private boolean dataToExportFound;
private boolean areAnyParticipantsPresent;
private boolean useEmailNotBT;
private DataHolder dataHolder;
private DateFormat dateParser, timeParser;
private File nonAlignedDataOutputFile;
private File signInReportsOutputFile;
private File cacheParticipationOutputFile;
private File cacheDataOutputFile;
private String signInReportsFileName;
private String participationFileName;
private String dataFileName;
private SendDataTask sendDataTask;
private XYSeries mCurrentSeries;
private XYMultipleSeriesDataset mDataset;
private GraphicalView mChartView;
private XYMultipleSeriesRenderer mRenderer;
private ParticipationSummaryListAdapter participationSummaryListAdapter;
private ExpandableListView projectsummaryExpandableListView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_participationsummary);
dateParser = new SimpleDateFormat("MM/dd/yyyy");
timeParser = new SimpleDateFormat("hh:mm aaa");
SendDataTask oldTask = (SendDataTask) getLastCustomNonConfigurationInstance();
if (oldTask != null) {
sendDataTask = oldTask;
sendDataTask.reAttach(this);
if (sendDataTask.getStatus() == Status.RUNNING) {
showProgressDialog();
restoreDataFromBeforeConfigurationChange(oldTask);
}
}
}
private void restoreDataFromBeforeConfigurationChange(SendDataTask oldTask) {
signInReportsFileName = oldTask.signInReportsFileName;
participationFileName = oldTask.participationFileName;
dataFileName = oldTask.dataFileName;
useEmailNotBT = oldTask.useEmailNotBT;
areAnyParticipantsPresent = oldTask.areAnyParticipantsPresent;
}
@Override
public void onResume() {
super.onResume();
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
dataHolder = createDataHolder();
if (mChartView == null)
updateDisplay(dataHolder);
else
mChartView.repaint();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save the current data, for instance when changing screen orientation
outState.putSerializable("dataset", mDataset);
outState.putSerializable("renderer", mRenderer);
outState.putSerializable("current_series", mCurrentSeries);
}
@Override
protected void onRestoreInstanceState(Bundle savedState) {
super.onRestoreInstanceState(savedState);
// restore the current data, for instance when changing the screen orientation
mDataset = (XYMultipleSeriesDataset) savedState.getSerializable("dataset");
mRenderer = (XYMultipleSeriesRenderer) savedState.getSerializable("renderer");
mCurrentSeries = (XYSeries) savedState.getSerializable("current_series");
}
private DataHolder createDataHolder() {
ProjectDAO projectDAO = new ProjectDAO(getApplicationContext());
ActivitiesDAO activitiesDAO = new ActivitiesDAO(getApplicationContext());
ParticipationDAO participationDAO = new ParticipationDAO(getApplicationContext());
ParticipantDAO participantDAO = new ParticipantDAO(getApplicationContext());
DataHolder dHolder = new DataHolder();
List<ProjectHolder> pHolder_data = new ArrayList<ProjectHolder>();
List<Project> projects_data = projectDAO.getAllProjects();
for (Project p : projects_data) {
ProjectHolder pHolder = new ProjectHolder();
pHolder.p = p;
List<ActivityHolder> aHolder_data = new ArrayList<ActivityHolder>();
List<Activities> activities_data = activitiesDAO.getAllActivitiesForProjectId(p.getId());
for (Activities a : activities_data) {
ActivityHolder aHolder = new ActivityHolder();
aHolder.a = a;
List<ParticipationHolder> paHolder_data = new ArrayList<ParticipationHolder>();
List<Participation> participation_data = participationDAO
.getServicedParticipationsForActivityId(a.getId());
for (Participation pa : participation_data) {
dataToExportFound = true;
ParticipationHolder paHolder = new ParticipationHolder();
paHolder.pa = pa;
paHolder.participantList = participantDAO
.getAllParticipantsForParticipationId(pa.getId());
paHolder_data.add(paHolder);
}
aHolder.participationHolderList = paHolder_data;
aHolder_data.add(aHolder);
}
pHolder.activityHolderList = aHolder_data;
pHolder_data.add(pHolder);
}
dHolder.pHolder_data = pHolder_data;
return dHolder;
}
/**
* Only updates UI elements. Does not create any email related items.
*
* @param dHolder
* DataHolder object containing details of current state of projects, activities,
* participations, and participants.
*/
private void updateDisplay(DataHolder dHolder) {
projectsummaryExpandableListView = (ExpandableListView) findViewById(R.id.projectsummaryListView);
participationSummaryListAdapter = new ParticipationSummaryListAdapter(this,
R.layout.row_projectsummary, R.layout.row_activitysummary,
projectsummaryExpandableListView, dHolder.pHolder_data);
participationSummaryListAdapter.setInflater((getLayoutInflater()));
projectsummaryExpandableListView.setAdapter(participationSummaryListAdapter);
// make sure all groups are expanded by default
for (int i = 0; i < dHolder.pHolder_data.size(); i++) {
projectsummaryExpandableListView.expandGroup(i);
}
// hide default arrow group indicator because we will provide our own
projectsummaryExpandableListView.setGroupIndicator(null);
}
private String[] updateCsppNames() {
return new String[] { getResources().getString(R.string.genderequalityandwomensempowerment),
getResources().getString(R.string.hivaids),
getResources().getString(R.string.technologyfordevelopment),
getResources().getString(R.string.youthasresources),
getResources().getString(R.string.volunteerism),
getResources().getString(R.string.peoplewithdisabilities) };
}
private String[] updateInitiativeNames() {
return new String[] { getResources().getString(R.string.malaria),
getResources().getString(R.string.ecpa), getResources().getString(R.string.foodsecurity) };
}
/**
* Callback for SendDataTask doInBackground()
* @param sendDataTask
*/
public void setDataToPreserveOnConfigurationChange(SendDataTask sendDataTask) {
/* these fields are preserved in sendDataTask to be used in case this activity is destroyed
and recreated e.g. on rotation, keyboard popup etc*/
DateFormat dateForFileNameParser = new SimpleDateFormat("MMddyyyy");
dataFileName = "RealTrack_Data_Report_"
+ dateForFileNameParser.format(Calendar.getInstance().getTimeInMillis()) + ".csv";
participationFileName = "RealTrack_Participation_Report_"
+ dateForFileNameParser.format(Calendar.getInstance().getTimeInMillis()) + ".csv";
signInReportsFileName = "RealTrack_SignIn_Report_"
+ dateForFileNameParser.format(Calendar.getInstance().getTimeInMillis()) + ".pdf";
File cacheDir = getApplicationContext().getCacheDir(); // context being the Activity pointer
cacheDataOutputFile = new File(cacheDir + File.separator + dataFileName);
cacheParticipationOutputFile = new File(cacheDir + File.separator + participationFileName);
signInReportsOutputFile = new File(cacheDir + File.separator + signInReportsFileName);
nonAlignedDataOutputFile = new File(cacheDir + File.separator + "temp.csv");
areAnyParticipantsPresent = new ParticipantDAO(getApplicationContext()).areAnyParticipantsPresent();
sendDataTask.dataFileName = dataFileName;
sendDataTask.participationFileName = participationFileName;
sendDataTask.signInReportsFileName = signInReportsFileName;
sendDataTask.useEmailNotBT = useEmailNotBT;
sendDataTask.areAnyParticipantsPresent = areAnyParticipantsPresent;
}
/**
* Creates files to email.
*
* @param dHolder
*/
public void sendDataTaskDoInBackgroundCallback() {
DataHolder dHolder = dataHolder;
String[] allInits = updateInitiativeNames();
String[] allCspps = updateCsppNames();
FileOutputStream dataFos = null;
FileOutputStream participationFos = null;
FileOutputStream signinFos = null;
Document signinDocument = null;
try {
dataFos = new FileOutputStream(nonAlignedDataOutputFile);
participationFos = new FileOutputStream(cacheParticipationOutputFile);
signinFos = new FileOutputStream(signInReportsOutputFile);
signinDocument = new Document(PageSize.A4);
PdfWriter.getInstance(signinDocument, signinFos);
signinDocument.open();
signinDocument.addTitle("RealTrack Sign-In Report");
Paragraph reportHeader = new Paragraph("RealTrack Sign-In Report", TITLE_FONT);
reportHeader.add(new Paragraph("Report generated on: "
+ (new SimpleDateFormat("MM/dd/yyyy hh:mm aaa").format(new Date()))));
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if (prefs.contains(getString(R.string.name)))
reportHeader
.add(new Paragraph("PCV Name: " + prefs.getString(getString(R.string.name), "")));
signinDocument.add(reportHeader);
LineSeparator ls = new LineSeparator();
signinDocument.add(new Chunk(ls));
}
catch (Exception e) {
}
String dataCSVContent = "Project Title" + "," + "Project Start Date" + "," + "Project End Date"
+ "," + "Project Notes" + "," + "Activity Title" + "," + "Activity Start Date" + ","
+ "Activity End Date" + "," + "Activity Cohort" + "," + "Activity Notes" + ","
+ "Activity Organizations" + "," + "Activity Community 1" + "," + "Activity CSPP" + ","
+ "Activity Initiatives" + "," + "Participation Date" + "," + "Participation Time"
+ "," + "Participation Men 0-9" + "," + "Participation Men 10-17" + ","
+ "Participation Men 18-24" + "," + "Participation Men over 25" + ","
+ "Participation Women 0-9" + "," + "Participation Women 10-17" + ","
+ "Participation Women 18-24" + "," + "Participation Women over 25" + ","
+ "Service Providers Men 0-9" + "," + "Service Providers Men 10-17" + ","
+ "Service Providers Men 18-24" + "," + "Service Providers Men over 25" + ","
+ "Service Providers Women 0-9" + "," + "Service Providers Women 10-17" + ","
+ "Service Providers Women 18-24" + "," + "Service Providers Women over 25" + ","
+ "Participation Event Details" + "\n";
String participationCSVContent = "Project Title" + "," + "Activity Title" + "," + "Cohort Name"
+ "," + "Participation Date" + "," + "Participation Time" + "," + "Participant Name"
+ "," + "Participant Phone Number" + "," + "Participant Village" + ","
+ "Participant Age" + "," + "Participant Gender" + "," + "Participation Event Details"
+ "\n";
try {
dataFos.write(dataCSVContent.getBytes());
participationFos.write(participationCSVContent.getBytes());
}
catch (IOException e) {
}
for (ProjectHolder pHolder : dHolder.pHolder_data) {
Project p = pHolder.p;
for (ActivityHolder aHolder : pHolder.activityHolderList) {
Activities a = aHolder.a;
for (ParticipationHolder paHolder : aHolder.participationHolderList) {
Participation participation = paHolder.pa;
Date d = new Date(participation.getDate());
String[] csppList = a.getCspp().split("\\|");
String cspp = "";
for (int i = 0; i < csppList.length; i++) {
if (csppList[i].equals("1"))
cspp += allCspps[i] + "|";
}
cspp = (cspp.length() > 1) ? cspp.substring(0, cspp.length() - 1) : ""; // remove the last
// superfluous
// pipe character
String[] initiativesList = a.getInitiatives().split("\\|");
String inits = "";
for (int i = 0; i < initiativesList.length; i++) {
if (initiativesList[i].equals("1"))
inits += allInits[i] + "|";
}
inits = (inits.length() > 1) ? inits.substring(0, inits.length() - 1) : ""; // remove the
// last
// superfluous
// pipe
// character
int currentComms = findNumberOfCommunities(a.getComms());
if (currentComms > maxComms)
maxComms = currentComms;
dataCSVContent = ESCAPE_COMMAS + p.getTitle() + ESCAPE_COMMAS + ","
+ dateParser.format(p.getStartDate()) + "," + dateParser.format(p.getEndDate())
+ "," + ESCAPE_COMMAS + p.getNotes() + ESCAPE_COMMAS + "," + ESCAPE_COMMAS
+ a.getTitle() + ESCAPE_COMMAS + "," + dateParser.format(a.getStartDate()) + ","
+ dateParser.format(a.getEndDate()) + "," + ESCAPE_COMMAS + a.getCohort()
+ ESCAPE_COMMAS + "," + ESCAPE_COMMAS + a.getNotes() + ESCAPE_COMMAS + ","
+ ESCAPE_COMMAS + a.getOrgs() + ESCAPE_COMMAS + "," + COMMUNITY_DELIMITER
+ a.getComms() + COMMUNITY_DELIMITER + cspp + "," + inits + ","
+ dateParser.format(participation.getDate()) + ","
+ timeParser.format(participation.getDate()) + "," + participation.getMen09()
+ "," + participation.getMen1017() + "," + participation.getMen1824() + ","
+ participation.getMenOver25() + "," + participation.getWomen09() + ","
+ participation.getWomen1017() + "," + participation.getWomen1824() + ","
+ participation.getWomenOver25() + "," + participation.getSpMen09() + ","
+ participation.getSpMen1017() + "," + participation.getSpMen1824() + ","
+ participation.getSpMenOver25() + "," + participation.getSpWomen09() + ","
+ participation.getSpWomen1017() + "," + participation.getSpWomen1824() + ","
+ participation.getSpWomenOver25() + "," + ESCAPE_COMMAS
+ participation.getNotes() + ESCAPE_COMMAS + "\n";
try {
dataFos.write(dataCSVContent.getBytes());
}
catch (IOException e) {
}
Paragraph projectParagraph = null;
PdfPTable table = null;
if (!paHolder.participantList.isEmpty()) {
projectParagraph = new Paragraph();
addNewLines(projectParagraph, 1);
projectParagraph.add(new Paragraph("Project Title: " + p.getTitle()));
projectParagraph.add(new Paragraph("Activity Title: " + a.getTitle()));
projectParagraph.add(new Paragraph("Reporting Cohort: " + a.getCohort()));
projectParagraph.add(new Paragraph("Sign-In Sheet for: " + dateParser.format(d) + " "
+ timeParser.format(d)));
projectParagraph.add(new Paragraph("Event details: " + participation.getNotes()));
projectParagraph.add(new Paragraph("Sign-in Sheet:"));
addNewLines(projectParagraph, 1);
table = new PdfPTable(new float[] { 2, 2, 2, 1, 1, 3 });
table.setWidthPercentage(100f);
PdfPCell c1 = new PdfPCell(new Phrase("Name"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
c1.setBackgroundColor(BaseColor.LIGHT_GRAY);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("Phone"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
c1.setBackgroundColor(BaseColor.LIGHT_GRAY);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("Village"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
c1.setBackgroundColor(BaseColor.LIGHT_GRAY);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("Age"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
c1.setBackgroundColor(BaseColor.LIGHT_GRAY);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("Gender"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
c1.setBackgroundColor(BaseColor.LIGHT_GRAY);
table.addCell(c1);
c1 = new PdfPCell(new Phrase("Signature"));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
c1.setBackgroundColor(BaseColor.LIGHT_GRAY);
table.addCell(c1);
table.setHeaderRows(1);
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
table.getDefaultCell().setVerticalAlignment(Element.ALIGN_CENTER);
}
for (Participant participant : paHolder.participantList) {
participationCSVContent = ESCAPE_COMMAS + p.getTitle() + ESCAPE_COMMAS + ","
+ ESCAPE_COMMAS + a.getTitle() + ESCAPE_COMMAS + "," + ESCAPE_COMMAS
+ a.getCohort() + ESCAPE_COMMAS + ","
+ dateParser.format(participation.getDate()) + ","
+ timeParser.format(participation.getDate()) + "," + ESCAPE_COMMAS
+ participant.getName() + ESCAPE_COMMAS + "," + ESCAPE_COMMAS
+ participant.getPhoneNumber() + ESCAPE_COMMAS + "," + ESCAPE_COMMAS
+ participant.getVillage() + ESCAPE_COMMAS + "," + participant.getAge() + ","
+ (participant.getGender() == Participant.MALE ? getString(R.string.male) : getString(R.string.female)) + ","
+ ESCAPE_COMMAS + participation.getNotes() + ESCAPE_COMMAS + "\n";
table.addCell(participant.getName());
table.addCell(participant.getPhoneNumber());
table.addCell(participant.getVillage());
table.addCell(Integer.toString(participant.getAge()));
table.addCell(participant.getGender() == Participant.MALE ? getString(R.string.male) : getString(R.string.female));
try {
Image signatureImage = Image.getInstance(participant.getSignaturePath());
PdfPCell imageCell = new PdfPCell(signatureImage);
imageCell.setHorizontalAlignment(Element.ALIGN_CENTER);
imageCell.setVerticalAlignment(Element.ALIGN_CENTER);
imageCell.setFixedHeight(50);
table.addCell(imageCell);
}
catch (BadElementException e1) {
table.addCell("Signature not found");
}
catch (MalformedURLException e1) {
table.addCell("Signature not found");
}
catch (IOException e1) {
table.addCell("Signature not found");
}
try {
participationFos.write(participationCSVContent.getBytes());
}
catch (IOException e) {
}
}
if (projectParagraph != null) {
projectParagraph.add(table);
try {
signinDocument.add(projectParagraph);
signinDocument.newPage();
}
catch (DocumentException e) {
}
}
}
}
}
try {
dataFos.close();
participationFos.close();
signinDocument.close();
}
catch (IOException e) {
}
normalizeCSVColumns(); // required if the user enters multiple communities separated by commas
}
private void addNewLines(Paragraph paragraph, int numLinesToAdd) {
for (int i = 0; i < numLinesToAdd; ++i)
paragraph.add(new Paragraph(" "));
}
private void normalizeCSVColumns() {
BufferedReader fRead = null;
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fos = new FileOutputStream(cacheDataOutputFile);
fis = new FileInputStream(nonAlignedDataOutputFile);
fRead = new BufferedReader(new InputStreamReader(fis));
}
catch (FileNotFoundException e) {
}
try {
// handle CSV column headings
int numCommasToAdd = maxComms;
String s = fRead.readLine();
String[] separatedStrings = s.split("Activity Community 1,");
String stringToWrite = separatedStrings[0];
for (int i = 0; i < numCommasToAdd; i++)
stringToWrite += "Activity Community " + (i + 1) + ",";
stringToWrite += separatedStrings[1] + "\n";
fos.write(stringToWrite.getBytes());
// handle the actual data
while (null != (s = fRead.readLine())) {
separatedStrings = s.split(COMMUNITY_DELIMITER);
stringToWrite = separatedStrings[0] + separatedStrings[1];
int currentComms = findNumberOfCommunities(separatedStrings[1]);
numCommasToAdd = 1;
if (currentComms < maxComms)
numCommasToAdd = maxComms - currentComms + 1;
for (int i = 0; i < numCommasToAdd; i++)
stringToWrite += ",";
stringToWrite += separatedStrings[2] + "\n";
fos.write(stringToWrite.getBytes());
}
}
catch (IOException e) {
}
try {
fis.close();
fRead.close();
fos.close();
}
catch (IOException e) {
}
}
private int findNumberOfCommunities(String comms) {
int numCommas = 0;
for (int i = 0; i < comms.length(); i++) {
if (comms.charAt(i) == ',')
numCommas++;
}
return numCommas + 1;
}
@Override
public void onBackPressed() {
super.onBackPressed();
overridePendingTransition(R.anim.animation_slideinleft, R.anim.animation_slideoutright);
deleteTemporaryFiles();
finish();
}
private void deleteTemporaryFiles() {
deleteFileIfNotNull(cacheDataOutputFile);
deleteFileIfNotNull(cacheParticipationOutputFile);
deleteFileIfNotNull(nonAlignedDataOutputFile);
deleteFileIfNotNull(signInReportsOutputFile);
}
private void deleteFileIfNotNull(File fileToDelete) {
if (fileToDelete != null)
fileToDelete.delete();
}
/**
* Class encapsulating details of current state of projects, activities, participations, and
* participants.
*
* @author Raj
*/
private class DataHolder {
List<ProjectHolder> pHolder_data;
}
class ProjectHolder {
Project p;
List<ActivityHolder> activityHolderList;
}
class ActivityHolder {
Activities a;
List<ParticipationHolder> participationHolderList;
}
class ParticipationHolder {
Participation pa;
List<Participant> participantList;
}
// create actionbar menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.participationsummarymenu, menu);
return true;
}
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// provide a back button on the actionbar
finish();
break;
case R.id.action_exportbt:
useEmailNotBT = false;
startSendDataTask();
break;
case R.id.action_exportdata:
useEmailNotBT = true;
startSendDataTask();
break;
case R.id.action_help:
HelpDialog helpDialog = new HelpDialog();
helpDialog.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
helpDialog.show(getSupportFragmentManager(), "helpdialog");
break;
case R.id.action_framework:
FrameworkInfoDialog frameworkInfoDialog = new FrameworkInfoDialog();
frameworkInfoDialog.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
frameworkInfoDialog.show(getSupportFragmentManager(), "frameworkinfodialog");
break;
case R.id.action_glossary:
GlossaryDialog glossaryDialog = new GlossaryDialog();
glossaryDialog.setStyle(DialogFragment.STYLE_NO_TITLE, 0);
glossaryDialog.show(getSupportFragmentManager(), "glossarydialog");
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
private void startSendDataTask() {
if (!dataToExportFound) {
Toast.makeText(getApplicationContext(),
getResources().getString(R.string.noparticipationstoexport), Toast.LENGTH_SHORT)
.show();
return;
}
showProgressDialog();
if (sendDataTask == null || sendDataTask.getStatus() == Status.FINISHED)
sendDataTask = new SendDataTask(this);
setDataToPreserveOnConfigurationChange(sendDataTask);
sendDataTask.execute();
}
/**
* Callback for SendDataTask onPostExecute()
*/
public void sendDataTaskOnPostExecuteCallback() {
removeExistingProgressDialog();
if (useEmailNotBT)
sendByEmail();
else
sendByBT();
}
private void sendByBT() {
BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
if (btAdapter == null) {
Toast.makeText(getApplicationContext(),
getResources().getString(R.string.nobluetoothsupport), Toast.LENGTH_SHORT).show();
return;
}
final Intent sendBTIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
sendBTIntent.setType("*/*");
ArrayList<Uri> uris = new ArrayList<Uri>();
uris.add(Uri.parse("content://" + CachedFileContentProvider.AUTHORITY + "/" + dataFileName));
if (areAnyParticipantsPresent) {
uris.add(Uri.parse("content://" + CachedFileContentProvider.AUTHORITY + "/"
+ participationFileName));
uris.add(Uri.parse("content://" + CachedFileContentProvider.AUTHORITY + "/"
+ signInReportsFileName));
}
sendBTIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
sendBTIntent.setComponent(new ComponentName("com.android.bluetooth",
"com.android.bluetooth.opp.BluetoothOppLauncherActivity"));
startActivityForResult(sendBTIntent, ParticipationSummaryActivity.SENDBT_REQUEST);
overridePendingTransition(R.anim.animation_slideinright, R.anim.animation_slideoutleft);
}
private void sendByEmail() {
final Intent sendEmailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
sendEmailIntent.setType("text/plain");
String uriText = "mailto:" + Uri.encode("") + "?subject=" + Uri.encode("RealTrack Data Report")
+ "&body=" + Uri.encode("Please find your data attached with this email.");
Uri uri = Uri.parse(uriText);
sendEmailIntent.setData(uri);
ArrayList<Uri> uris = new ArrayList<Uri>();
uris.add(Uri.parse("content://" + CachedFileContentProvider.AUTHORITY + "/" + dataFileName));
if (areAnyParticipantsPresent) {
uris.add(Uri.parse("content://" + CachedFileContentProvider.AUTHORITY + "/"
+ participationFileName));
uris.add(Uri.parse("content://" + CachedFileContentProvider.AUTHORITY + "/"
+ signInReportsFileName));
}
sendEmailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
// stupid workaround to get GMail to work with SEND_MULTIPLE
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
sendEmailIntent.setType(null);
final Intent restrictIntent = new Intent(Intent.ACTION_SENDTO);
Uri data = Uri.parse("mailto:?to=some@email.com");
restrictIntent.setData(data);
sendEmailIntent.setSelector(restrictIntent);
}
startActivityForResult(Intent.createChooser(sendEmailIntent, getString(R.string.sendmail)),
ParticipationSummaryActivity.SENDEMAIL_REQUEST);
overridePendingTransition(R.anim.animation_slideinright, R.anim.animation_slideoutleft);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
/* leaving the ifs in here in case we want some behavior specific to email/BT in the future */
if (requestCode == SENDEMAIL_REQUEST) {
deleteTemporaryFiles();
}
else if (requestCode == SENDBT_REQUEST) {
deleteTemporaryFiles();
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
removeExistingProgressDialog();
}
@Override
public Object onRetainCustomNonConfigurationInstance() {
return sendDataTask;
}
private void showProgressDialog() {
ProgressDialogFragment.newInstance().show(getSupportFragmentManager(), PROGRESS_DIALOG_TAG);
}
private void removeExistingProgressDialog() {
ProgressDialogFragment progressDialogFragment = (ProgressDialogFragment) getSupportFragmentManager().findFragmentByTag(PROGRESS_DIALOG_TAG);
if(progressDialogFragment != null)
progressDialogFragment.dismiss();
}
}